/**
  ******************************************************************************
  * @file    dac.h
  * @author  ashuai0110
  * @version V1.0
  * @date    2024-01-12
  * @brief   dac驱动,适用于PIC16(L)F1788_9
  *
  ******************************************************************************
  * @attention
  *
  ******************************************************************************
  */

#ifndef __DAC_H
#define __DAC_H

#ifdef __cplusplus
extern "C" {
#endif

/* 包含头文件-----------------------------------------------------------------*/
#include "common.h"

/* 宏定义---------------------------------------------------------------------*/
#define DAC1_CMD(x)                         (DAC1EN = (x)) /* DAC1开关 0:关闭 1:使能 */
#define DAC2_CMD(x)                         (DAC2EN = (x)) /* DAC2开关 0:关闭 1:使能 */
#define DAC3_CMD(x)                         (DAC3EN = (x)) /* DAC3开关 0:关闭 1:使能 */
#define DAC4_CMD(x)                         (DAC4EN = (x)) /* DAC4开关 0:关闭 1:使能 */
    
#define DAC1_SET_VALUE(x)                   (DAC1CON1 = (x)) /* 设置DAC1输出 */
#define DAC2_SET_VALUE(x)                   (DAC2CON1 = (x)) /* 设置DAC2输出 */
#define DAC3_SET_VALUE(x)                   (DAC3CON1 = (x)) /* 设置DAC3输出 */
#define DAC4_SET_VALUE(x)                   (DAC4CON1 = (x)) /* 设置DAC4输出 */
    
/* dacx */
#define DAC1                                (0u) /* 8位DAC */
#define DAC2                                (1u) /* 5位DAC */
#define DAC3                                (2u) /* 5位DAC */
#define DAC4                                (3u) /* 5位DAC */
/* dac_out_channel DAC输出引脚选择 */
#define DAC_OUT_ALL_OFF                     (0u) /* DACOUT1 DACOUT2引脚输出全关 */
#define DAC_OUT_1_ON_2_OFF                  (2u) /* DACOUT1引脚输出打开 DACOUT2引脚输出关闭 */
#define DAC_OUT_2_ON_1_OFF                  (1u) /* DACOUT2引脚输出打开 DACOUT1引脚输出关闭 */
#define DAC_OUT_ALL_ON                      (3u) /* DACOUT1 DACOUT2引脚输出全开 */
/* positive_reference DAC正参考电压选择 */    
#define DAC_PSS_VDD                         (0u) /* DAC正参考选择Vdd */
#define DAC_PSS_VREF                        (1u) /* DAC正参考选择Vref+引脚 */
#define DAC_PSS_FVR2                        (2u) /* DAC正参考选择FVR缓冲器2输出 */
#define DAC_PSS_RESERVE                     (3u) /* 保留,不使用 */
/* negative_reference DAC负参考电压选择(5位DAC负参考默认Vss不可更改) */   
#define DAC_NSS_VSS                         (0u) /* DAC负参考选择Vss */
#define DAC_NSS_VREF                        (1u) /* DAC负参考选择Vref-引脚 */
    
/* 类型定义-------------------------------------------------------------------*/
typedef struct dac_config {
    uint8_t outCh : 3; /* @ref dac_out_channel */
    uint8_t pss : 3;   /* @ref positive_reference */
    uint8_t nss : 2;   /* @ref negative_reference */
}dac_config_t;
    
/* 全局变量-------------------------------------------------------------------*/

/* 函数原型-------------------------------------------------------------------*/
void dac_init(uint8_t dacx, dac_config_t _config);
void dac_de_init(uint8_t dacx);

void dac_cmd(uint8_t dacx, uint8_t state);

void dac_set_value(uint8_t dacx, uint8_t value);

#ifdef __cplusplus
}
#endif

#endif /* dac.h */